package genetica.cruce;

import genetica.cromosomas.Cromosoma;
import genetica.cromosomas.genes.Gen;

import java.util.ArrayList;
import java.util.Random;
import java.util.TreeSet;

public class CruceInserccionAlFinal extends AlgoritmoCruce {
	public CruceInserccionAlFinal(double pCruce) {
		super(pCruce);
	}

	@Override
	public void cruce(Cromosoma prog1, Cromosoma prog2) {

		Random generador = new Random();
		int genesCruzados = (generador.nextInt(prog1.getGenes().size()));
		// Obtener codificación de los cromosomas
	
		int tam = prog1.getGenes().size();
		
		TreeSet<Integer> arbol = new TreeSet<Integer>();
		while (arbol.size() < genesCruzados){
			// si esta repetido no se mete en el arbol
			arbol.add(generador.nextInt(prog1.getGenes().size()));
		}
		ArrayList<Gen> genes1 = new ArrayList<Gen>(); 
		ArrayList<Gen> genes2 = new ArrayList<Gen>();
		while (arbol.size() > 0){
			int pos = arbol.pollLast();
			genes1.add(prog1.getGenes().get(pos));  
			genes2.add(prog2.getGenes().get(pos));  
		}
			
		while(genes2.size() > 0){
			Gen g = genes2.remove(0);
			prog1.getGenes().remove(g);
			prog1.getGenes().add(g);
			g = genes1.remove(0);
			prog2.getGenes().remove(g);
			prog2.getGenes().add(g);
		}
		
		// Cruzar en un punto de cruce


		// Traducir la codificacion
		/*
		 * GenP2[] hijo1Traducido = descodifica(hijo1); GenP2[] hijo2Traducido =
		 * descodifica(hijo2);
		 */
		// se evaluan y sustituyen a los padres
		// prog1.setGenes(desc1);
		// prog2.setGenes(desc2);
		// padre.setAptitud(padre.evalua());
		// madre.setAptitud(madre.evalua());

	}

	public int factorial(int n) {
		int result = 1;
		for (result = 1; result < n; result++)
			result *= result;
		return result;
	}

	@Override
	public String toString() {
		return "Cruce por insercción al final";
	}

	// @SuppressWarnings("unchecked")
	// private void calculaPermutaciones(ArrayList<ArrayList<Gen>> resultado,
	// ArrayList<Gen> genesRestantes, ArrayList<Gen> permuta) {
	// for (int i = 0; i < genesRestantes.size(); i++) {
	// ArrayList<Gen> genesTemp = (ArrayList<Gen>) genesRestantes.clone();
	// ArrayList<Gen> nuevaPermuta = (ArrayList<Gen>) permuta.clone();
	// Gen genPermutado = genesTemp.remove(i);
	// nuevaPermuta.add(genPermutado);
	// if (nuevaPermuta.size() == nGenes) {
	// resultado.add(nuevaPermuta);
	// } else {
	// calculaPermutaciones(resultado, genesTemp, nuevaPermuta);
	// }
	//
	// }
	// }
}
